re 正则表达式

正则表达式入门参考

match()

match()方法会从 字符串的起始位置匹配正则表达式 ,如果匹配,就返回匹配成功的结果,如果不匹配,就返回none。

基本使用

1
2
3
4
5
6
7
8
import re

content = 'Hello 123_456_789 World! This is a Regex Demo!'

result = re.match('^Hello\s\d{3}_\d{3}_\d{3}\s\w{5}!\s\w{4}',content)
print(result) # 返回SRE_Match object 对象 证明匹配成功
print(result.group()) # group()方法输出匹配到的内容
print(result.span()) # 输出匹配的范围

匹配目标

1
2
3
4
5
6
7
# 匹配目标
result = re.match('^Hello\s(\d{3}_\d{3}_\d{3})\s\w{5}!\s(\w{4})',content)
# 用括号将想提取的子字符串括起来,再使用group()方法传入分组的索引即可获取
print(result)
print(result.group(0)) # 索引0 为匹配到的所有内容
print(result.group(1)) # 分组的索引从1开始获取
print(result.group(2))

通用匹配 & 贪婪与非贪婪

1
2
3
4
5
6
7
8
# 通用匹配
# . 可以匹配任意字符
# * 可以匹配前面的字符无限次
# .*可以匹配任意字符任意次数
result = re.match('Hello.*is',content) # 贪婪匹配 一直匹配到最后一个is
print(result.group())
result =re.match('Hello.*?is',content) # 非贪婪 匹配到第一个is就结束
print(result.group())

修饰符

1
result = re.match('Hello.*is',content,re.S) # 传入修饰符
  • re.I:忽视大小写
  • re.L:做本地化识别匹配
  • re.M:多行匹配,影响^和$
  • re.S:使.匹配包括换行在内的所有字符
  • re.U:根据Unicode字符集解析字符,影响\w,\W,\b,\B
  • re.X:该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解

转义匹配

当遇到使用正则匹配模式的特殊字符时,在前面加上 ’ \ ’ ,来匹配原始字符。

search()在匹配时,会扫描整个字符串,然后返回第一个成功匹配的结果,成功匹配返回匹配内容,如果匹配失败返回None。和match()的区别,match更适合用来检测字符串是不是符合正则表达式的规则,而search匹配字符串内是否有符合正则表的是规则的内容。使用方法与match()大同小异。

findall()

findall()是爬虫用到最多的方法,它会搜索整个字符串,然后返回匹配正则表达式的所有内容。爬虫是爬数据,所以返回内容才是最关键的。如果有返回的话,就是返回一个列表类型,列表内的元素是元组类型,所以需要遍历来依次获取每组内容。

sub()

1
2
3
4
5
6
7
8
import re

content = '123abc456def789ghi'
# re.sub(正则表达式,替换的字符串,原字符串)
content = re.sub('\d+','',content)
# 可以在提取html文本时,去除某些标签,再处理
print(content)
# abcdefghi

compile()

可以将正则表达式编译成正则表达式对象,可以在之后的匹配中复用。

1
2
3
content = 'aabcdefg'
pattern = re.compile('.*')
result = pattern.findall(content)

Xi2A5SCk55Q1Wow6DdCjhQ==